"""     МОДУЛЬ АВТОРИЗАЦИИ ПОЛЬЗОВАТЕЛЕЙ.
Вызывается через функцию get_user. Параметры - имя ini файла.
Возвращает ссылку на класс User. Атрибуты класса соответствуют именам полей из
таблицы users."""

import os
import sys
import configparser

from PyQt5.QtWidgets import *
from PyQt5.QtSql import *
from PyQt5.QtGui import *


def get_user(ini_file):

    """ Создаём диалоговую форму авторизации. Если авторизация прошла успешно,
    то возвращаем ссылку на класс User."""
    dialog = DialogLogin(ini_file)
    result = dialog.exec_()
    if result:
        return(dialog.user)


def column_field(model):

    """ Словарь: имя поля -> номер столбца. """
    index = {}
    for i in range(model.columnCount()):
        index[model.record().fieldName(i)] = i
    return index


class DialogLogin(QDialog):

    def __init__(self, ini_file):
        super().__init__()

        """ Запоминаем имя ini файла. Создаём пользовательский интерфейс.
        Связываем форму с данными."""
        self.ini_file = ini_file
        self.setup_ui()
        self.init()

    def setup_ui(self):

        """ ЛОГИН. """
        self.cmb_login = QComboBox()

        """ ПАРОЛЬ. Звездочки вместо символов. """
        self.edt_password = QLineEdit("")
        self.edt_password.setEchoMode(QLineEdit.Password);

        """ КНОПКА."""
        self.btn_login = QPushButton('АВТОРИЗАЦИЯ')
        self.btn_login.clicked.connect(self.login)

        """ ФОРМА. """
        self.form = QFormLayout()
        self.form.addRow("Пользователь", self.cmb_login)
        self.form.addRow("Пароль", self.edt_password)
        self.form.addRow(self.btn_login)
        self.setLayout(self.form)
        self.setWindowTitle("АВТОРИЗАЦИЯ")
        self.setWindowIcon(QIcon("pict\\order.ico"))
        self.setMinimumWidth(200)
        self.show()

    def init(self):

        """ ЛОГИН. Модель - запрос. Созаём словарь: имя поля -> колонка.
        Устанавливаем колонку для отображения в поле."""
        self.model = QSqlQueryModel()
        self.model.setQuery(
            "SELECT rec_id, surname, name, patronymic, passwd, sity "
            "FROM users "
            "WHERE access = 0 "
            "ORDER BY surname;")
        if self.model.lastError().isValid ():
            logging.critical('Поле логин: {}'.format( self.model.lastError().text()))
            quit()

        self.column_dict = column_field(self.model)
        self.cmb_login.setModel(self.model)
        self.cmb_login.setModelColumn(self.column_dict['surname'])

        """ ЧТЕНИЕ ПРЕДЫДУЩЕГО ЛОГИНа. Предыдущей логин записан а ini файле в секции
        USER, параметр login. Добавляем к ini файлу путь до каталога APPDATA.
        Создаем переменную парсера ini файла и читаем туда файл. Если секции нет,
        то создаём с пустым значением параметра lofin."""
        self.ini_file = "{}\\{}".format(os.getenv('APPDATA'), self.ini_file)
        self.config = configparser.ConfigParser()
        self.config.read(self.ini_file)
        if not ('USER' in self.config):
            self.config['USER'] = {'login': ""}

        """ УСТАНОВКА ЛОГИН. Читаем параметр login через get на случай случайной
        порчи структуры секции USER. Если параметр находим в списке поля login,
        то устанавливаем его."""
        login = self.config['USER'].get('login','')
        if login:
            self.cmb_login.setCurrentIndex(self.cmb_login.findText(login))

    def login(self):

        """ ПРОВЕРКА ПАРОЛЯ. По выбранному индексу поля находим в модели пароль.
        Если пароль не равен введённому, то выводим сообщение."""
        index_login = self.cmb_login.currentIndex()
        passwd = self.model.record(index_login).value('passwd')
        if self.edt_password.text() != passwd:
            report = QMessageBox()
            report.setIcon(QMessageBox.Warning) # иконка
            report.setWindowTitle("НЕПРАВИЛЬНЫЙ ПАРОЛЬ.")
            report.setText("Введите правильный пароль или обратитесь к системному администратору.")
            report.setWindowIcon(ICON_APP)
            report.exec_()
            return

        """ ПАРОЛЬ СОВПАЛ.
        Создаем класс User. Поля записи переводим в атрибуты класса."""
        class User(): pass
        self.user = User()
        for field in self.column_dict:
            setattr(self.user, field, self.model.record(index_login).value(field))

        """ Записываем логин в конфиг файл."""
        self.config['USER']['login'] = self.cmb_login.currentText()
        with open(self.ini_file, 'w') as file_ini:
            self.config.write(file_ini)
        self.accept()

    def closeEvent(self,e):
        self.reject()


if __name__ == '__main__':

    app = QApplication(sys.argv)

    import logging
    logging.basicConfig(filename='login.log',level=logging.DEBUG,
        format = u'%(filename)s[LINE:%(lineno)d]# %(levelname)-8s %(message)s')

    from connmysql import conn_sql
    db = conn_sql("order.ini")
    if not db:
        logging.error('Нет соединения с БД')
        print("нет соединения")
        quit()
    logging.debug('Соединение с БД')

    user = get_user_code("order.ini")
    if user:
        quit()
    print(user.passwd, user.surname, user.sity, user.rec_id)
    sys.exit(app.exec_())

